// Copyright (C) 1999-2001 by Jason Hunter <jhunter_AT_acm_DOT_org>.
// All rights reserved.  Use of this class is limited.
// Please see the LICENSE for more information.

package com.baomidou.framework.upload.multipart;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletInputStream;

/**
 * A <code>ParamPart</code> is an upload part which represents a normal
 * <code>INPUT</code> (for example a non <code>TYPE="file"</code>) form
 * parameter.
 * 
 * @author Geoff Soutter
 * @author Jason Hunter
 * @version 1.1, 2002/04/30, added better encoding support, thanks to Changshin
 *          Lee
 * @version 1.0, 2000/10/27, initial revision
 */
public class ParamPart extends Part {

	/** contents of the parameter */
	private byte[] value;

	private String encoding;

	/**
	 * Constructs a parameter part; this is called by the parser.
	 * 
	 * @param name
	 *            the name of the parameter.
	 * @param in
	 *            the servlet input stream to read the parameter value from.
	 * @param boundary
	 *            the MIME boundary that delimits the end of parameter value.
	 * @param encoding
	 *            the byte-to-char encoding to use by default value.
	 */
	ParamPart(String name, ServletInputStream in, String boundary, String encoding) throws IOException {
		super(name);
		this.encoding = encoding;

		// Copy the part's contents into a byte array
		PartInputStream pis = new PartInputStream(in, boundary);
		ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
		byte[] buf = new byte[128];
		int read;
		while ((read = pis.read(buf)) != -1) {
			baos.write(buf, 0, read);
		}
		pis.close();
		baos.close();

		// save it for later
		value = baos.toByteArray();
	}

	/**
	 * Returns the value of the parameter as an array of bytes or a zero length
	 * array if the user entered no value for this parameter.
	 * 
	 * @return value of parameter as raw bytes
	 */
	public byte[] getValue() {
		return value;
	}

	/**
	 * Returns the value of the parameter in as a string (using the
	 * parser-specified encoding to convert from bytes) or the empty string if
	 * the user entered no value for this parameter.
	 * 
	 * @return value of parameter as a string.
	 */
	public String getStringValue() throws UnsupportedEncodingException {
		return getStringValue(encoding);
	}

	/**
	 * Returns the value of the parameter in the supplied encoding or empty
	 * string if the user entered no value for this parameter.
	 * 
	 * @return value of parameter as a string.
	 */
	public String getStringValue(String encoding) throws UnsupportedEncodingException {
		return new String(value, encoding);
	}

	/**
	 * Returns <code>true</code> to indicate this part is a parameter.
	 * 
	 * @return true.
	 */
	public boolean isParam() {
		return true;
	}
}
